# @Time : 2020/6/29 11:14
# @Author : Fioman 
# @Phone : 13149920693
"""
@classmethod定义的是操作类的而不是实例的方法.
classmethod改变了调用方法的方式,因此类方法的第一个参数是类本身,而不是实例.
classmethod最常见的用途是定义备选构造方法,例如上例中的frombytes.注意,frombytes的最后一行使用cls参数构建了一个新的实例,即cls(*memv)
按照约定,类方法的第一个参数名是cls(但是Python不介意怎么命名)
staticmethod装饰器也会改变方法的调用方式,但是第一个参数不是特殊的值.其实,静态方法就是普通的函数,只是碰巧在类的定义体重,而不是在模块层定义.
"""
class Demo(object):
    @classmethod
    def klassmeth(*args):
        return args

    @staticmethod
    def statmeth(*args):
        return args

if __name__ == '__main__':
    print("Demo.klassmeth() : {}".format(Demo.klassmeth()))
    print("Demo.klassmeth('spam') : {}".format(Demo.klassmeth("spam")))
    print("Demo.statmeth() : {}".format(Demo.statmeth()))
    print("Dmmo.statmeth('spam') : {}".format(Demo.statmeth('spam')))

    # klassmeth返回全部的位置参数
    # statmeth也是
    # 不管怎么样调用Demo.klassmeth,它的第一个参数始终是Demo类
    # Demo.statmeth的行为与普通的函数相似

    """
    classmethod 装饰器非常的有用,但是我从未见过不得不用staticmethod的情况.如果想定义不需要与类交互的函数,那么在模块中定义就好了.
    有时,函数虽然从不处理类,但是函数的功能与类紧密相关,因此想把它放在近处.即便如此,在同一模块中的类前面或后面定义函数也可以了.
    """

